/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#pragma once

#include "节点/节点.h"
#include "节点/输入输出节点.h"



class C_函数节点 : public C_节点基类 {
	std::vector<C_节点基类*> m_InNodes;
	std::vector<C_节点基类*> m_OutNudes;

	std::string m_函数声明;
	std::string m_函数定义;
public:
	C_函数节点(S_设备环境& ctx, C_节点树* link_tree);
	~C_函数节点();

	expand_接口函数_函数节点 m_函数指针;
	S_Props		             m_链接的节点树名称;

	S_Props		m_编译运行;
	void f_get子集输入节点(std::vector<C_节点基类*>& inNodes);
	void f_get子集输出节点(std::vector<C_节点基类*>& outNodes);

	//C_节点树* f_get子集树() { return m_子树; }
	bool		f_update();
	std::string	f_编译(C_节点基类* rn, std::string& 声明, std::vector<std::string>& 定义, std::string& 释放);
	void		f_异步解算();

	void			f_读取(FILE* f);
	void			f_写入(FILE* f);
	bool			f_getIsLink() { return m_是否链接; }
	void			f_绑定子节点树(C_节点树* tree);
	std::wstring	f_getLinkTreeName() { return f_prop_Str(m_链接的节点树名称); }

	S_物体* f_get虚拟体();
	void	f_入回收();
	void	f_回收();

	void    f_Copy(const C_节点基类* node);
protected:
	bool		m_是否链接;

};

C_节点基类* f_node_创建函数节点(S_设备环境& ctx, C_节点树* 子节点树);
C_节点基类* f_node_加载函数节点(S_设备环境& ctx, FILE* f);
void		f_node_保存函数节点(C_节点基类* n, FILE* f);





class C_Python节点 : public C_节点基类 {
	//C_节点树* m_子树;

public:
	C_Python节点(S_设备环境& ctx);
	~C_Python节点();

	S_文档文本	m_代码;
	S_Props		m_FilePath;

	std::vector<C_节点基类*> m_InNodes;
	std::vector<C_节点基类*> m_OutNudes;
	void f_get子集输入节点(std::vector<C_节点基类*>& inNodes);
	void f_get子集输出节点(std::vector<C_节点基类*>& outNodes);

	//C_节点树* f_get子集树() { return m_子树; }

	bool	f_update();
	//void	f_编译();

	void	f_读取(FILE* f);
	void	f_写入(FILE* f);

};

C_节点基类* f_node_加载Python节点(S_设备环境& ctx, FILE* f);
void		f_node_保存Python节点(C_节点基类* n, FILE* f);






class C_结构节点 : public C_节点基类 {
	std::vector<C_节点基类*> m_InNodes;
	std::vector<C_节点基类*> m_OutNudes;

	//std::string m_函数声明;
	//std::string m_函数定义;
public:
	C_结构节点(S_设备环境& ctx, C_节点树* link_tree);
	~C_结构节点();

	expand_接口函数_函数节点 m_函数指针;

	S_Props		m_编译运行;
	void f_get子集输入节点(std::vector<C_节点基类*>& inNodes);
	void f_get子集输出节点(std::vector<C_节点基类*>& outNodes);

	bool		f_update();
	std::string DEF_节点编译函数;
	void		f_异步解算();

	void	f_读取(FILE* f);
	void	f_写入(FILE* f);
	void    f_Copy(const C_节点基类* node);

};

C_节点基类* f_node_创建结构节点(S_设备环境& ctx, C_节点树* 子节点树);
C_节点基类* f_node_加载结构节点(S_设备环境& ctx, FILE* f);
void		f_node_保存结构节点(C_节点基类* n, FILE* f);






